#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <mimalloc-2.1/mimalloc.h>

void mimalloc_once()
{
    // 分配 1MB 的内存
    void *p = mi_malloc(1024 * 1024);
    if (p == NULL)
    {
        // 处理内存分配失败的情况
        perror("mi_malloc filed");
        return;
    }

    // 使用分配的内存
    memset(p, 0, 1024 * 1024);

    // 释放内存
    mi_free(p);
}

void mimalloc_more()
{
    printf("内存池库 mimalloc 调用2次\n");
    // 分配 1MB 的内存
    void *p = mi_malloc(1024 * 1024);
    void *p2 = mi_malloc(1024 * 1024);
    if (p == NULL)
    {
        // 处理内存分配失败的情况
        perror("mi_malloc filed");
        return;
    }

    // 使用分配的内存
    memset(p, 0, 1024 * 1024);
    memset(p2, 0, 1024 * 1024);

    // 释放内存
    mi_free(p);
    mi_free(p2);
}

void malloc_more()
{
    printf("系统调用 malloc 调用2次\n");
    // 分配 1MB 的内存
    void *p = malloc(1024 * 1024);
    void *p2 = malloc(1024 * 1024);
    if (p == NULL)
    {
        // 处理内存分配失败的情况
        perror("mi_malloc filed");
        return;
    }

    // 使用分配的内存
    memset(p, 0, 1024 * 1024);
    memset(p2, 0, 1024 * 1024);

    // 释放内存
    free(p);
    free(p2);
}

int main(int argc, char *argv[])
{
    int cmd = 0;
    if (argc != 1)
    {
        cmd = atoi(argv[1]);
        if (cmd == 1)
            mimalloc_once();
        else if (cmd == 2)
            mimalloc_more();
        else if (cmd == 3)
            malloc_more();
    }
    else
    {
        mimalloc_more();
    }

    return 0;
}

/* 测试1:
strace -f -e trace=memory ./1_mimalloc_示例.out 1
strace -f -e trace=memory ./1_mimalloc_示例.out 2

只触发一次 系统调用
brk()
map()
munmap()

strace -f -e trace=memory ././2_默认使用mimalloc_库.out
触发2次 系统调用
 */

/* 测试2:
strace -f -e trace=memory ./1_mimalloc_示例.out 3

也只触发一次 系统调用
brk()
map()
munmap()

 */
// 如果使用 mimalloc库，malloc 被替换为 mi_malloc